using System.Text.Json.Serialization;

namespace Sage.CloudStorage.Qiniu.Config
{
    /// <summary>
    /// 七牛云配置类 - 管理七牛云SDK的全局配置
    /// </summary>
    /// <remarks>
    /// 此类包含七牛云SDK的所有可配置选项，包括域名、超时设置、重试策略等。
    /// 可以在创建QiniuClient时提供自定义配置，或使用默认配置。
    /// </remarks>
    public class QiniuConfig
    {
        #region 域名配置

        /// <summary>
        /// 资源管理域名
        /// </summary>
        public string RsHost { get; set; } = "http://rs.qiniu.com";

        /// <summary>
        /// 批量操作域名
        /// </summary>
        public string RsfHost { get; set; } = "http://rsf.qiniu.com";

        /// <summary>
        /// 数据处理域名
        /// </summary>
        public string ApiHost { get; set; } = "http://api.qiniu.com";

        /// <summary>
        /// 融合CDN域名
        /// </summary>
        public string CdnHost { get; set; } = "http://fusion.qiniuapi.com";

        /// <summary>
        /// 上传域名
        /// </summary>
        public string UpHost { get; set; } = "http://upload.qiniup.com";

        /// <summary>
        /// UC域名
        /// </summary>
        public string UcHost { get; set; } = "http://uc.qiniuapi.com";

        #endregion

        #region 网络配置

        /// <summary>
        /// 连接超时时间（毫秒）
        /// </summary>
        public int ConnectionTimeout { get; set; } = 30000;

        /// <summary>
        /// 读取超时时间（毫秒）
        /// </summary>
        public int ReadTimeout { get; set; } = 60000;

        /// <summary>
        /// 写入超时时间（毫秒）
        /// </summary>
        public int WriteTimeout { get; set; } = 60000;

        /// <summary>
        /// 最大重试次数
        /// </summary>
        public int MaxRetryTimes { get; set; } = 3;

        /// <summary>
        /// 使用HTTPS协议
        /// </summary>
        public bool UseHttps { get; set; } = true;

        #endregion

        #region 上传配置

        /// <summary>
        /// 分片上传的块大小（字节）
        /// </summary>
        public int BlockSize { get; set; } = 4 * 1024 * 1024; // 4MB

        /// <summary>
        /// 分片上传的并发数
        /// </summary>
        public int ChunkUploadConcurrency { get; set; } = 3;

        /// <summary>
        /// 上传进度回调间隔（字节）
        /// </summary>
        public int ProgressCallbackInterval { get; set; } = 1024 * 1024; // 1MB

        #endregion

        #region 高级配置

        /// <summary>
        /// 是否自动选择最优上传域名
        /// </summary>
        public bool AutoSelectUploadHost { get; set; } = true;

        /// <summary>
        /// 是否禁用七牛时间戳签名
        /// </summary>
        [JsonPropertyName("disable_qiniu_timestamp_signature")]
        public bool DisableQiniuTimestampSignature { get; set; } = false;

        /// <summary>
        /// 是否使用CDN加速下载
        /// </summary>
        public bool UseCdnForDownload { get; set; } = true;

        #endregion

        /// <summary>
        /// 根据是否使用HTTPS协议，返回对应的域名前缀
        /// </summary>
        /// <returns>域名前缀（http://或https://）</returns>
        public string GetScheme() => UseHttps ? "https://" : "http://";

        /// <summary>
        /// 获取带协议的资源管理域名
        /// </summary>
        /// <returns>完整的资源管理域名</returns>
        public string GetRsHost() => GetScheme() + RsHost.TrimStart("http://".ToCharArray()).TrimStart("https://".ToCharArray());

        /// <summary>
        /// 获取带协议的批量操作域名
        /// </summary>
        /// <returns>完整的批量操作域名</returns>
        public string GetRsfHost() => GetScheme() + RsfHost.TrimStart("http://".ToCharArray()).TrimStart("https://".ToCharArray());

        /// <summary>
        /// 获取带协议的数据处理域名
        /// </summary>
        /// <returns>完整的数据处理域名</returns>
        public string GetApiHost() => GetScheme() + ApiHost.TrimStart("http://".ToCharArray()).TrimStart("https://".ToCharArray());

        // 删除了未使用的GetApiHost(string bucket)方法，因为它不是已发布的公共API的一部分

        /// <summary>
        /// 获取带协议的融合CDN域名
        /// </summary>
        /// <returns>完整的融合CDN域名</returns>
        public string GetCdnHost() => GetScheme() + CdnHost.TrimStart("http://".ToCharArray()).TrimStart("https://".ToCharArray());

        /// <summary>
        /// 获取带协议的上传域名
        /// </summary>
        /// <returns>完整的上传域名</returns>
        public string GetUpHost() => GetScheme() + UpHost.TrimStart("http://".ToCharArray()).TrimStart("https://".ToCharArray());

        /// <summary>
        /// 获取带协议的UC域名
        /// </summary>
        /// <returns>完整的UC域名</returns>
        public string GetUcHost() => GetScheme() + UcHost.TrimStart("http://".ToCharArray()).TrimStart("https://".ToCharArray());
    }
}